contentprovider: Add gdk_content_provider_new_typed()
authorBenjamin Otte <otte@redhat.com>
Sun, 16 Feb 2020 13:24:03 +0000 (14:24 +0100)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Feb 2020 19:10:30 +0000 (20:10 +0100)
Gets around the boilerplate required to create and initialize a GValue
by having this function doing it via G_VALUE_COLLECT().

docs/reference/gdk/gdk4-sections.txt
gdk/gdkcontentproviderimpl.c
gdk/gdkcontentproviderimpl.h
gtk/gtkcalendar.c
gtk/gtkpathbar.c
gtk/gtktext.c
tests/testclipboard2.c
tests/testdnd.c
tests/testdnd2.c
tests/testentryicons.c
tests/testlist3.c

index 48eadea63b96f17e9a3a9a39f451b74e771e5d01..eccaad1dab39624bdb5a722ba8f3c154b7b738ab 100644 (file)
@@ -1199,6 +1199,7 @@ gdk_clipboard_get_type
 GdkContentProvider
 GdkContentProviderClass
 gdk_content_provider_new_for_value
+gdk_content_provider_new_typed
 gdk_content_provider_new_for_bytes
 gdk_content_provider_ref_formats
 gdk_content_provider_ref_storable_formats
index e5c86a396cdfefe18b23941f08b2c5cd57c274fb..3be95cbed745a1d397c0f561168504c2a3da7329 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "gdkcontentprovider.h"
 
+#include <gobject/gvaluecollector.h>
+
 #include "gdkcontentformats.h"
 #include "gdkcontentserializer.h"
 #include "gdkintl.h"
@@ -124,6 +126,44 @@ gdk_content_provider_new_for_value (const GValue *value)
   return GDK_CONTENT_PROVIDER (content);
 }
 
+/**
+ * gdk_content_provider_new_typed:
+ * @type: Type of value to follow
+ * ...: value
+ *
+ * Create a content provider that provides the value of the given
+ * @type.
+ *
+ * The value is provided using G_VALUE_COLLECT(), so the same rules
+ * apply as when calling g_object_new() or g_object_set().
+ *
+ * Returns: a new #GdkContentProvider
+ **/
+GdkContentProvider *
+gdk_content_provider_new_typed (GType type,
+                                ...)
+{
+  GdkContentProviderValue *content;
+  va_list args;
+  char *error;
+
+  content = g_object_new (GDK_TYPE_CONTENT_PROVIDER_VALUE, NULL);
+
+  va_start (args, type);
+  G_VALUE_COLLECT_INIT (&content->value, type, args, 0, &error);
+  if (error)
+    {
+      g_warning ("%s: %s", G_STRLOC, error);
+      g_free (error);
+      /* we purposely leak the value here, it might not be
+       * in a sane state if an error condition occoured
+       */
+    }
+  va_end (args);
+
+  return GDK_CONTENT_PROVIDER (content);
+}
+
 #define GDK_TYPE_CONTENT_PROVIDER_BYTES            (gdk_content_provider_bytes_get_type ())
 #define GDK_CONTENT_PROVIDER_BYTES(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_CONTENT_PROVIDER_BYTES, GdkContentProviderBytes))
 #define GDK_IS_CONTENT_PROVIDER_BYTES(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GDK_TYPE_CONTENT_PROVIDER_BYTES))
index cea0b6b667da75e144c24d3e993c3ed567e3afb8..c10158e5bb1dc7b8d1caba4f6b05fe0c60b02288 100644 (file)
@@ -32,6 +32,9 @@ G_BEGIN_DECLS
 GDK_AVAILABLE_IN_ALL
 GdkContentProvider *    gdk_content_provider_new_for_value              (const GValue           *value);
 GDK_AVAILABLE_IN_ALL
+GdkContentProvider *    gdk_content_provider_new_typed                  (GType                   type,
+                                                                         ...);
+GDK_AVAILABLE_IN_ALL
 GdkContentProvider *    gdk_content_provider_new_for_bytes              (const char             *mime_type,
                                                                          GBytes                 *bytes);
 
index 70b34ff84c492ac1567dbf9a0fc9cd6bae9a1f62..769d85f68df68ea9a95e3bec39efb0132256d121 100644 (file)
@@ -1166,8 +1166,6 @@ get_calendar_content (GtkCalendar *calendar)
   GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
   GDate *date;
   gchar str[128];
-  GValue value = G_VALUE_INIT;
-  GdkContentProvider *content;
 
   date = g_date_new_dmy (g_date_time_get_day_of_month (priv->date),
                          g_date_time_get_month (priv->date),
@@ -1175,12 +1173,7 @@ get_calendar_content (GtkCalendar *calendar)
   g_date_strftime (str, 127, "%x", date);
   g_free (date);
 
-  g_value_init (&value, G_TYPE_STRING);
-  g_value_set_string (&value, str);
-  content = gdk_content_provider_new_for_value (&value);
-  g_value_unset (&value);
-
-  return content;
+  return gdk_content_provider_new_typed (G_TYPE_STRING, str);
 }
 
 static void
index 51427ca6ec1232c6274e6689b1b603b9572f5bdc..152efa625b8d5b0cbdd0b8a6502fe0b3c11197ca 100644 (file)
@@ -1196,7 +1196,6 @@ make_directory_button (GtkPathBar  *path_bar,
   AtkObject *atk_obj;
   GtkWidget *child = NULL;
   ButtonData *button_data;
-  GValue value = G_VALUE_INIT;
   GdkContentProvider *content;
   GtkDragSource *source;
 
@@ -1245,14 +1244,11 @@ make_directory_button (GtkPathBar  *path_bar,
   g_object_weak_ref (G_OBJECT (button_data->button),
                     (GWeakNotify) button_data_free, button_data);
 
-  g_value_init (&value, G_TYPE_FILE);
-  g_value_set_object (&value, button_data->file);
   source = gtk_drag_source_new ();
-  content = gdk_content_provider_new_for_value (&value);
+  content = gdk_content_provider_new_typed (G_TYPE_FILE, button_data->file);
   gtk_drag_source_set_content (source, content);
   g_object_unref (content);
   gtk_widget_add_controller (button_data->button, GTK_EVENT_CONTROLLER (source));
-  g_value_unset (&value);
 
   return button_data;
 }
index b671c9a39f680212db60e4b6a035b06ba36f0e99..6dce1b327bde515b037e2c41342375c8870e071b 100644 (file)
@@ -2851,7 +2851,6 @@ gtk_text_drag_gesture_update (GtkGestureDrag *gesture,
           GdkDrag *drag;
           GdkPaintable *paintable;
           GdkContentProvider *content;
-          GValue value = G_VALUE_INIT;
 
           text = _gtk_text_get_selected_text (self);
           gtk_text_get_pixel_ranges (self, &ranges, &n_ranges);
@@ -2861,10 +2860,7 @@ gtk_text_drag_gesture_update (GtkGestureDrag *gesture,
           else
             actions = GDK_ACTION_COPY;
 
-          g_value_init (&value, G_TYPE_STRING);
-          g_value_set_string (&value, text);
-          content = gdk_content_provider_new_for_value (&value);
-          g_value_unset (&value);
+          content = gdk_content_provider_new_typed (G_TYPE_STRING, text);
 
           drag = gdk_drag_begin (gdk_event_get_surface ((GdkEvent*) event),
                                  gdk_event_get_device ((GdkEvent*) event),
index d09c06050fd2714f10a6c5343a5427af8e49a60b..da812f6782c52ee74795d24b480b0fd07e0837a4 100644 (file)
@@ -344,13 +344,10 @@ get_button_list (GdkClipboard *clipboard,
                        "GdkPixbuf");
   g_value_unset (&value);
 
-  g_value_init (&value, G_TYPE_STRING);
-  g_value_set_string (&value, "Hello Clipboard ☺");
   add_provider_button (box,
-                       gdk_content_provider_new_for_value (&value),
+                       gdk_content_provider_new_typed (G_TYPE_STRING, "Hello Clipboard ☺"),
                        clipboard,
                        "gchararry");
-  g_value_unset (&value);
 
   add_provider_button (box,
                        gdk_content_provider_new_for_bytes ("text/plain;charset=utf-8",
index 41a5109240e12e675ccc8bf47bbfc0d2f4773adb..40ec72d60cb24a1357b59cc9fb1876f5ddbcbc72 100644 (file)
@@ -605,7 +605,6 @@ main (int argc, char **argv)
   GdkPixbuf *drag_icon;
   GdkTexture *texture;
   GdkContentProvider *content;
-  GValue value = G_VALUE_INIT;
   GtkDragSource *source;
   GdkContentFormats *targets;
   GtkDropTarget *dest;
@@ -673,10 +672,7 @@ main (int argc, char **argv)
   button = gtk_label_new ("Drag Here\n");
 
   source = gtk_drag_source_new ();
-  g_value_init (&value, G_TYPE_STRING);
-  g_value_set_string (&value, "I'm data!");
-  content = gdk_content_provider_new_for_value (&value);
-  g_value_unset (&value);
+  content = gdk_content_provider_new_typed (G_TYPE_STRING, "I'm data!");
   gtk_drag_source_set_content (source, content);
   g_object_unref (content);
   gtk_drag_source_set_actions (source, GDK_ACTION_COPY|GDK_ACTION_MOVE);
index 608c955b03f98e9b5614e04d4548b205874cfbea..cfb0da65c532974d53b2f48fe64ca4d9a0e6d3d3 100644 (file)
@@ -439,21 +439,17 @@ make_spinner (void)
   GtkWidget *spinner;
   GtkDragSource *source;
   GdkContentProvider *content;
-  GValue value = G_VALUE_INIT;
 
   spinner = gtk_spinner_new ();
   gtk_spinner_start (GTK_SPINNER (spinner));
 
-  g_value_init (&value, G_TYPE_STRING);
-  g_value_set_string (&value, "ACTIVE");
-  content = gdk_content_provider_new_for_value (&value);
+  content = gdk_content_provider_new_typed (G_TYPE_STRING, "ACTIVE");
   source = gtk_drag_source_new ();
   gtk_drag_source_set_content (source, content);
   g_signal_connect (source, "drag-begin", G_CALLBACK (spinner_drag_begin), spinner);
   gtk_widget_add_controller (spinner, GTK_EVENT_CONTROLLER (source));
 
   g_object_unref (content);
-  g_value_unset (&value);
 
   return spinner;
 }
index 796295a61f815be3d8970985f0058551832511a6..14d3cb6b5d59d606255fd1fccb568a5f55df9a82 100644 (file)
@@ -100,7 +100,6 @@ main (int argc, char **argv)
   GtkWidget *button4;
   GIcon *icon;
   GdkContentProvider *content;
-  GValue value = G_VALUE_INIT;
   gboolean done = FALSE;
 
   gtk_init ();
@@ -165,10 +164,7 @@ main (int argc, char **argv)
                                   GTK_ENTRY_ICON_PRIMARY,
                                   "Save a file");
  
-  g_value_init (&value, G_TYPE_STRING);
-  g_value_set_string (&value, "Amazing");
-  content = gdk_content_provider_new_for_value (&value);
-  g_value_unset (&value);
+  content = gdk_content_provider_new_typed (G_TYPE_STRING, "Amazing");
   gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
                                   GTK_ENTRY_ICON_PRIMARY,
                                   content, GDK_ACTION_COPY); 
index 4240d7817262d3493449af297df30f6ffa4a2eb3..fb5fd1adddfac824514217c8c86fc67454cbe5a9 100644 (file)
@@ -6,15 +6,7 @@ prepare (GtkDragSource *source,
          double         y,
          GtkWidget     *row)
 {
-  GdkContentProvider *content;
-  GValue value = G_VALUE_INIT;
-
-  g_value_init (&value, GTK_TYPE_LIST_BOX_ROW);
-  g_value_set_object (&value, row);
-  content = gdk_content_provider_new_for_value (&value);
-  g_value_unset (&value);
-
-  return content;
+  return gdk_content_provider_new_typed (GTK_TYPE_LIST_BOX_ROW, row);
 }
 
 static void